#ifndef EsFaceIDManager_h
#define EsFaceIDManager_h
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import "EsFeature.h"
#import "EsFaceIDResult.h"
#import "EsFaceIDConfig.h"
#import "EsOnVerifyCallback.h"
#import "FaceViewController.h"
#import "EsFeatureVersion.h"
#import "ImgQualityInfo.h"

NS_ASSUME_NONNULL_BEGIN

/**
 * 人脸认证管理类
 */
@interface EsFaceIDManager : NSObject
/**
 * 人脸认证配置
 */
@property  (nonatomic, copy) EsFaceIDConfig* config;
/**
 * 认证界面ViewController
 */
@property  (atomic) FaceViewController* faceVc;
/**
 * 获取是否上传异常日志
 */
+ (BOOL) isUploadLog;
/**
 * 设置是否上传异常日志
 * @param value YES: 上传错误日志，NO: 不上传错误日志
 */
+ (void) setIsUploadLog: (BOOL)value;
/**
 * 实例化
 * @return 实例对象
 */
+(EsFaceIDManager*)getInstance;
/**
 * 获取证书授权初始化信息
 * @return 授权初始化信息
 */
-(NSString *)getCertificateInfo;
/**
 * 初始化引擎,注册人脸引擎,使用前必须调用一次，切全局调用一次即可
 * @param certificate 授权证书(从服务器返回)
 * @param config 初始化参数
 * @return 执行结果
 */
-(EsFaceIDResult *) esCreateByCertificate:(NSString *)certificate EsFaceIDConfig:(EsFaceIDConfig*)config;

/**
 * 检查本地缓存证书是否存在，是否有效
 * @return EsFaceIDResult 执行结果
 */
+(EsFaceIDResult *) checkCertificate;
/**
 * 注销引擎，只需调用一次
 */
-(void)esDestory;
/**
 * 获取照片中人脸特征信息
 *
 * @param image 照片数据
 * @return 人脸特征数据
 */
-(EsFaceIDResult *)getFaceFeature:(UIImage *)image;
/**
 * 获取照片中人脸特征信息
 *
 * @param base64Img 照片数据(base64)
 * @return 人脸特征数据
 */
-(EsFaceIDResult *)getFaceFeatureWithBase64Img:(NSString *)base64Img;
/**
 * 获取数据库特征数据个数
 *
 * @param dbName 数据库名称
 * @return 数据库中特征数据个数
 */
-(int)getDbSize:(NSString *)dbName;
/**
 * 往数据库添加人脸特征信息，如果人脸存在，那么将会被覆盖
 *
 * @param feature 人脸特征信息
 * @param dbName  数据库名称
 * @return 执行结果
 */
-(EsFaceIDResult* )addFeatureToDb:(EsFeature*)feature dbName:(NSString *)dbName;
/**
 * 删除人脸特征信息
 *
 * @param personId 人脸特征ID
 * @param dbName   数据库名称
 * @return 执行结果
 */
-(EsFaceIDResult* )removeFeatureById:(NSString*)personId dbName:(NSString *)dbName;
/**
 * 列出本地数据库
 *
 * @return 所有数据库名称
 */
-(NSArray<NSString *> *)listDBs;

/**
 * 列出本地数据库
 * @param regex
 * @return 所有数据库名称
 */
-(NSArray<NSString *> *)listDBsWithFilter:(NSString *)regex;
/**
 * 列出数据库内的persionID
 *
 * @param dbName 数据库名称
 * @param limit 做多限制个数
 * @return 数据库中的所有实人ID
 */
-(NSArray<NSString *> *)listPersonIdByDbName:(NSString*)dbName limit:(NSString*)limit;
/**
 * 通过persionID获取人脸特征数据
 * @param personId 实人ID
 * @param dbName 数据库名称
 * @return 执行结果
 */
-(EsFaceIDResult *)getFeatureByPersionId:(NSString *)personId dbName:(NSString*)dbName;
/**
 * 清空数据库
 * @param dbName 数据库名称
 * @return 执行结果
 */
-(EsFaceIDResult *) clearDb:(NSString *) dbName;

/**
 * 传入特征进行比对，当 feats 的长度为 1 时，就是 1:1，返回的分数为 float[0],
 * 当 feats 的长度大于 1 时，就相当于是 1:N，返回的比对分数与库 feats 的特征一一对应
 *
 * @param featA 需要比对的特征
 * @param feats 需要比对的特征库
 * @return 与库里面的特征一一对应的比对分数
 */
-(NSArray<NSNumber *> *)verifyFaceFeatures:(NSData *)featA feats:(NSArray<NSData *> *)feats;
/**
 * 一比一比对返回特征值
 *
 * @param featA 需要比对的特征
 * @param featB 需要比对的特征
 * @return 与库里面的特征一一对应的比对分数
 */
-(NSNumber *)verifyFaceFeature:(NSData *)featA feats:(NSData *)featB;
/**
 * 在某一个人脸数据库中进行人脸比对
 *
 * @param featA  要比较的人脸数据
 * @param dbName 数据库名称
 * @return NSMutableDictionary<NSString *,NSNumber *> * 与数据库比较之后的  persionID，scores 键值对
 */
-(NSMutableDictionary<NSString *,NSNumber *> *)verifyFaceFeatureByDbName:(NSData *)featA dbName:(NSString *)dbName;
/**
 * 在某一个人脸数据库中进行人脸比对
 *
 * @param featA     要比较的人脸数据
 * @param dbName    数据库名称
 * @param threshold 比对阈值
 * @return 数据库中的人脸数据比较之后的匹配的persionID：scores键值对
 */
-(NSMutableDictionary<NSString *,NSNumber *> *)verifyFaceFeatureByDbName:(NSData *)featA dbName:(NSString *)dbName threshold:(int) threshold useCashed:(Boolean) useCashed;
/**
 * 开始执行人脸检测以及人脸认证
 *
 * @param dbName 数据库
 * @param control 当前页面的 ViewController
 * @param callback 回调协议 需要实现<EsOnVerifyCallback>接口
 */
-(void)startVerify:(NSString *) dbName ViewController:(UIViewController *)control callback:(id<EsOnVerifyCallback>) callback;
/**
 * 停止执行人脸检测以及人脸认证
 */
-(void)stopVerify;
/**
 * 返回人脸信息版本信息
 *
 * @param feat 人脸特征数据
 * @return 执行结果
 */
-(EsFeatureVersion *) getFeatureVersion:(NSDate *)feat;

/**
 * 人脸搜索(搜索dbName下注册的人脸信息)
 * 如果图片存在多张人脸会进行多次回调，errcode =  EF_FACE_RECOGNITION_END 时代表全部人脸检索完成
 * @param image    人脸照片,如果照片中有多张人脸会多次分别回调
 * @param dbName   搜索的数据库名称
 * @param callback 结果回调接口（可能会多次回调）
 */
-(void)recognitionFace:(UIImage *)image dbName:(NSString *)dbName callback:(id<EsOnVerifyCallback>) callback;
/**
* 获取sdk版本
 */
+ (NSString *)getSDKVersion;

/**
 * 返回数据库最大容量
 * @return 数据库最大容量
 */
-(int)getDbMaxSize;

/**
 * 往页面添加一条浮动信息
 *
 * @param image 图片
 * @title 标题
 * @description 描述
 */
-(void)addPromptBox:(UIImage *)image title:(NSString *)title description:(NSString *)description promtId:(NSString *)promtId;

/**
 * 获取人脸照片质量
 * @param base64Img 照片数据
 * @return 照片质量判断结果
 */
-(ImgQualityInfo *)getImgQuality:(NSString *)base64Img;

//public void recognitionFace(final Bitmap bitmap, final String dbName, final EsOnVerifyCallback callback) {

@end

NS_ASSUME_NONNULL_END
#endif /* EsFaceIDManager_h */
